package server

//
//import (
//	"context"
//	"fmt"
//	"gitee.com/go-mid/infra/xconfig"
//	_ "gitee.com/go-mid/infra/xconfig/xyaml"
//	core "gitee.com/go-mid/infra/xcore"
//	"gitee.com/go-mid/infra/xlog"
//	stat "gitee.com/go-mid/infra/xstat/sys"
//	xprom "gitee.com/go-mid/infra/xstat/xmetric/xprometheus"
//	"gitee.com/go-mid/infra/xtime"
//	"gitee.com/go-mid/infra/xtrace"
//	"gitee.com/go-mid/booter/bootservice"
//	"math/rand"
//	"strings"
//	"sync"
//)
//
//type YamlServer struct {
//	BaseServer
//	shutdownCallback []func()
//	servConf         servConfig
//	servicePower     *bootservice.ServicePower
//	cfgdir           string
//}
//
//func NewYamlServer(  sname string, cfgdir string) *YamlServer {
//	server := &YamlServer{
//		BaseServer: BaseServer{
//			sname:                  sname,
//			muLocks:                sync.Mutex{},
//			services:               make(map[string]bootservice.Service),
//			servInfos:              make(map[string]*bootservice.ServInfo),
//			preServiceDriverFuncs:  make([]func(ctx context.Context, server Server) error, 0),
//			postServiceDriverFuncs: make([]func(ctx context.Context, server Server) error, 0),
//		},
//		shutdownCallback: make([]func(), 0),
//		cfgdir:           cfgdir,
//	}
//
//	return server
//}
//
//type servConfig struct {
//	LogDir       string `yaml:"logDir" json:"logDir"`
//	LogLevel     string `yaml:"logLevel" json:"logLevel"`
//	SessKey      string `yaml:"sessKey" json:"sessKey"`
//	BackdoorPort string `yaml:"backdoorPort" json:"backdoorPort"`
//}
//
////启动服务，初始化过程是有序的
////1. 初始化配置中心
////2. 初始化服务唯一标识sid
////3. 初始化日志框架
////4. 执行业务初始化函数initfunc（注意：初始化函数不能时间过长，否则启动时间过久；初始化函数失败，则启动失败）
////5. 初始化trace组件
////6. 初始化 业务注册的服务（服务先初始化init，再驱动启动，driver）
////7. 初始化后门程序，用于监控进程的状态
////8. 初始化埋点组件
//func (m *YamlServer) Startup(ctx context.Context) error {
//	fun := "YamlServer.Startup -->"
//	//初始化服务配置信息
//	if err := m.initConf(ctx); err != nil {
//		xlog.Panicf(ctx, "%s initConf err: %v", fun, err)
//		return err
//	}
//	//初始化sid
//	if err := m.initSid(ctx); err != nil {
//		xlog.Panicf(ctx, "%s initSid err: %v", fun, err)
//		return err
//	}
//	// 初始化日志
//	m.initLog(ctx)
//	defer xlog.AppLogSync()
//	defer xlog.StatLogSync()
//	// 初始化服务进程打点
//	stat.Init(m.ServGroup(ctx), m.ServName(ctx), "")
//	// App层 服务启动 前置初始化
//	if err := m.initPreServiceDriverFuncs(ctx); err != nil {
//		xlog.Panicf(ctx, "%s initPreServiceDriverFuncs err: %v", fun, err)
//		return err
//	}
//	// NOTE: bootservice 在初始化 trace middleware 前需要保证 xtrace.GlobalTracer() 初始化完毕
//	m.initTracer(ctx)
//	//初始化一个service启动器
//	m.initServicePower(ctx)
//	//初始化service
//	if err := m.initProcessor(ctx); err != nil {
//		xlog.Panicf(ctx, "%s callInitFunc err: %v", fun, err)
//		return err
//	}
//	// App层 服务启动 后置初始化hook
//	if err := m.initPostServiceDriverFuncs(ctx); err != nil {
//		xlog.Panicf(ctx, "%s initPostServiceDriverFuncs err: %v", fun, err)
//		return err
//	}
//	// NOTE: initBackdoor会启动http服务，但由于health check的http请求不需要追踪，且它是判断服务启动与否的关键，所以initTracer可以放在它之后进行
//	m.initBackdoor(ctx)
//	//初始化埋点
//	m.initMetric(ctx)
//
//	xlog.Infof(ctx, "server start success, servInfo: [%s]", m.servInfos)
//	return nil
//}
//
//func (m *YamlServer) Shutdown(ctx context.Context) error {
//	fmt.Println("====shutdown====")
//	return nil
//}
//
//func (m *YamlServer) AppendShutdownCallback(ctx context.Context, f func()) {
//	m.muLocks.Lock()
//	defer m.muLocks.Unlock()
//	m.shutdownCallback = append(m.shutdownCallback, f)
//}
//
//func (m *YamlServer) IsLocalRunning(ctx context.Context) bool {
//	return true
//}
//
//func (m *YamlServer) ServInfos(ctx context.Context) map[string]*bootservice.ServInfo {
//	m.muLocks.Lock()
//	defer m.muLocks.Unlock()
//	return m.servInfos
//}
//func (m *YamlServer) appendServInfos(ctx context.Context, sInfos map[string]*bootservice.ServInfo) {
//	m.muLocks.Lock()
//	defer m.muLocks.Unlock()
//	for k, v := range sInfos {
//		m.servInfos[k] = v
//	}
//	return
//}
//
//func (m *YamlServer) AppendService(services map[string]bootservice.Service) {
//	for k, v := range services {
//		m.services[k] = v
//	}
//}
//func (m *YamlServer) AppendPreServiceDriverFuncs(initfns []func(ctx context.Context, server Server) error) {
//	m.preServiceDriverFuncs = append(m.preServiceDriverFuncs, initfns...)
//}
//func (m *YamlServer) AppendPostServiceDriverFuncs(initfns []func(ctx context.Context, server Server) error) {
//	m.postServiceDriverFuncs = append(m.postServiceDriverFuncs, initfns...)
//}
//
//func (m *YamlServer) initConf(ctx context.Context) error {
//	fun := "Server.initConf -->"
//	st := xtime.NewTimeStat()
//	xlog.Infof(ctx, "%s start ", fun)
//	defer func() {
//		xlog.Infof(ctx, "%s end, durationMs: %d", fun, st.Millisecond())
//	}()
//	center, err := xconfig.NewConfigCenter(ctx, xconfig.ConfigTypeYaml, m.cfgdir, m.ServLocation(ctx), nil, nil)
//	if err != nil {
//		return err
//	}
//	m.configCenter = center
//	var servConf servConfig
//	err = m.configCenter.UnmarshalWithNamespace(ctx, "serv", &servConf)
//	if err != nil {
//		return err
//	}
//	m.servConf = servConf
//	return err
//}
//func (m *YamlServer) initSid(ctx context.Context) error {
//	fun := "Server.initSid -->"
//	st := xtime.NewTimeStat()
//	xlog.Infof(ctx, "%s start ", fun)
//	defer func() {
//		xlog.Infof(ctx, "%s end, durationMs: %d", fun, st.Millisecond())
//	}()
//
//	if m.servConf.SessKey == "" {
//		m.servConf.SessKey = core.RandString(10, 1)
//	}
//	//生成唯一id，此处随机生成
//	sid := rand.Int()
//	m.servId = sid
//	return nil
//}
//func (m *YamlServer) initLog(ctx context.Context) error {
//	fun := "Server.initLog -->"
//	st := xtime.NewTimeStat()
//	xlog.Infof(ctx, "%s start ", fun)
//	defer func() {
//		xlog.Infof(ctx, "%s end, durationMs: %d", fun, st.Millisecond())
//	}()
//
//	logDir := m.servConf.LogDir
//	logLevel := m.servConf.LogLevel
//	var logpath string
//	if logDir == "" {
//		logDir = "/data/bootservice/wread0"
//	}
//	if logDir == "console" {
//		logpath = ""
//	} else {
//		logpath = fmt.Sprintf("%s/%s", logDir, m.Copyname(ctx))
//	}
//	if logLevel == "" {
//		logLevel = "info"
//	}
//
//	xlog.Infof(ctx, "%s init log dir:%s ", fun, logpath)
//	extraHeaders := map[string]interface{}{
//		"ip": m.ServIp(ctx),
//	}
//	xlog.InitAppLogV2(logpath, "serv.log", convertLevel(logLevel), extraHeaders)
//	xlog.InitStatLog(logpath, "stat.log")
//	xlog.SetStatLogService(m.ServLocation(ctx))
//	xlog.Infof(ctx, "%s end ", fun)
//	return nil
//}
//
//func convertLevel(level string) xlog.Level {
//	level = strings.ToLower(level)
//	switch level {
//	case "debug":
//		return xlog.DebugLevel
//	case "info":
//		return xlog.InfoLevel
//	case "warn":
//		return xlog.WarnLevel
//	case "error":
//		return xlog.ErrorLevel
//	case "fatal":
//		return xlog.FatalLevel
//	case "panic":
//		return xlog.PanicLevel
//	default:
//		return xlog.InfoLevel
//	}
//}
//
//func (m *YamlServer) initPreServiceDriverFuncs(ctx context.Context) error {
//	fun := "YamlServer.initPreServiceDriverFuncs -->"
//	st := xtime.NewTimeStat()
//	xlog.Infof(ctx, "%s start ", fun)
//	defer func() {
//		xlog.Infof(ctx, "%s end, durationMs: %d", fun, st.Millisecond())
//	}()
//	for _, initLogicFunc := range m.preServiceDriverFuncs {
//		if err := initLogicFunc(ctx, m); err != nil {
//			return err
//		}
//	}
//	return nil
//}
//func (m *YamlServer) initPostServiceDriverFuncs(ctx context.Context) error {
//	fun := "YamlServer.initPostServiceDriverFuncs -->"
//	st := xtime.NewTimeStat()
//	xlog.Infof(ctx, "%s start ", fun)
//	defer func() {
//		xlog.Infof(ctx, "%s end, durationMs: %d", fun, st.Millisecond())
//	}()
//	for _, initLogicFunc := range m.postServiceDriverFuncs {
//		if err := initLogicFunc(ctx, m); err != nil {
//			return err
//		}
//	}
//	return nil
//}
//
//func (m *YamlServer) initTracer(ctx context.Context) error {
//	fun := "YamlServer.initTracer -->"
//	st := xtime.NewTimeStat()
//	xlog.Infof(ctx, "%s start ", fun)
//	defer func() {
//		xlog.Infof(ctx, "%s end, durationMs: %d", fun, st.Millisecond())
//	}()
//
//	err := xtrace.InitDefaultTracer(m.ServLocation(ctx))
//	if err != nil {
//		xlog.Errorf(ctx, "%s init tracer err: %v", fun, err)
//	}
//
//	return err
//}
//func (m *YamlServer) initServicePower(ctx context.Context) error {
//	fun := "YamlServer.initServicePower -->"
//	st := xtime.NewTimeStat()
//	xlog.Infof(ctx, "%s start ", fun)
//	defer func() {
//		xlog.Infof(ctx, "%s end, durationMs: %d", fun, st.Millisecond())
//	}()
//
//	m.servicePower = bootservice.NewServicePower(m.ServGroup(ctx), m.ServName(ctx))
//
//	return nil
//}
//
//func (m *YamlServer) initProcessor(ctx context.Context) error {
//	fun := "YamlServer.initProcessor -->"
//	st := xtime.NewTimeStat()
//	xlog.Infof(ctx, "%s start ", fun)
//	defer func() {
//		xlog.Infof(ctx, "%s end, durationMs: %d", fun, st.Millisecond())
//	}()
//
//	for n, p := range m.services {
//		if len(n) == 0 {
//			xlog.Errorf(ctx, "%s bootservice name empty", fun)
//			return fmt.Errorf("bootservice name empty")
//		}
//
//		if n[0] == '_' {
//			xlog.Errorf(ctx, "%s bootservice name can not prefix '_'", fun)
//			return fmt.Errorf("bootservice name can not prefix '_'")
//		}
//
//		if p == nil {
//			xlog.Errorf(ctx, "%s bootservice:%s is nil", fun, n)
//			return fmt.Errorf("bootservice:%s is nil", n)
//		} else {
//			err := p.Init()
//			if err != nil {
//				xlog.Errorf(ctx, "%s bootservice: %s init err: %v", fun, n, err)
//				return fmt.Errorf("bootservice:%s init err:%s", n, err)
//			}
//		}
//	}
//
//	_, err := m.loadDriver(ctx, m.services)
//	if err != nil {
//		xlog.Errorf(ctx, "%s load driver err: %v", fun, err)
//		return err
//	}
//	//本地启动不需要注册
//
//	return nil
//}
//func (m *YamlServer) initBackdoor(ctx context.Context) error {
//	fun := "YamlServer.initBackdoor -->"
//	st := xtime.NewTimeStat()
//	xlog.Infof(ctx, "%s start ", fun)
//	defer func() {
//		xlog.Infof(ctx, "%s end, durationMs: %d", fun, st.Millisecond())
//	}()
//
//	backdoor := &bootservice.BackDoorHttp{
//		Port: m.servConf.BackdoorPort,
//	}
//	err := backdoor.Init()
//	if err != nil {
//		xlog.Errorf(ctx, "%s init backdoor err: %v", fun, err)
//		return err
//	}
//	_, err = m.loadDriver(ctx, map[string]bootservice.Service{"_PROC_BACKDOOR": backdoor})
//	if err == nil {
//		if err != nil {
//			xlog.Errorf(ctx, "%s register backdoor err: %v", fun, err)
//		}
//
//	} else {
//		xlog.Warnf(ctx, "%s load backdoor driver err: %v", fun, err)
//	}
//
//	return err
//}
//
//func (m *YamlServer) initMetric(ctx context.Context) error {
//	fun := "YamlServer.initMetric -->"
//	st := xtime.NewTimeStat()
//	xlog.Infof(ctx, "%s start ", fun)
//	defer func() {
//		xlog.Infof(ctx, "%s end, durationMs: %d", fun, st.Millisecond())
//	}()
//
//	metrics := xprom.NewMetricProcessor()
//	err := metrics.Init()
//	if err != nil {
//		xlog.Warnf(ctx, "%s init metrics err: %v", fun, err)
//	}
//
//	_, err = m.loadDriver(ctx, map[string]bootservice.Service{"_PROC_METRICS": metrics})
//	return nil
//}
//
//func (m *YamlServer) loadDriver(ctx context.Context, procs map[string]bootservice.Service) (map[string]*bootservice.ServInfo, error) {
//	fun := "Server.loadDriver -->"
//
//	infos := make(map[string]*bootservice.ServInfo)
//
//	for name, processor := range procs {
//		servInfo, err := m.servicePower.PowerProcessorDriver(ctx, name, processor)
//		if err == bootservice.ErrNilDriver {
//			xlog.Infof(ctx, "%s bootservice: %s no driver, skip", fun, name)
//			continue
//		}
//		if err != nil {
//			xlog.Errorf(ctx, "%s load error, bootservice: %s, err: %v", fun, name, err)
//			return nil, err
//		}
//
//		infos[name] = servInfo
//		xlog.Infof(ctx, "%s load ok, bootservice: %s, serv addr: %s", fun, name, servInfo.Addr)
//	}
//	m.appendServInfos(ctx, infos)
//
//	return infos, nil
//}
